package com.xjh.basestudy.lanqiaobei;
/**
 * 1.在遍历时，如果需要 多次判断 某个条件（例如判断质数），此时必须完全通过循环才算质数，可以使用一个 标志变量 (flag) 来控制逻辑。初始时 默认为 true，一旦发现不符合条件的情况，就将其 置为 false。
 *
 * */
public class While_ {
    public static void main(String[] args) {

//        java18_c_1();

        java18_c_2();


    }

    public static void java18_c_1() {
        /**
         * 小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球，但需要108元的船票，而他却身无分文。
         * 他决定在 X 星战打工。好心的老板答应包食宿，第1天给他1元钱。并且，以后的每一天都比前一天多2元钱，直到他有足够的钱买票。请计算一下，小明在第几天就能凑够 108元，返回地球。
         * - 分析：循环次数布置，循环终止条件已知。使用while循环，终止条件：总工资>=108元。
         *  1: sum =1
         *  2: todayMoney:1+2=3 sum= 3+1=4,
         *  3:todayMoney:3+2=5 sum=4+5=9
         * */
//        int sum = 0;//总钱数
//        int i =1;//每天挣得钱数。
//        int day =0;//总天数
//        while (true){
//            sum+=i; //总天数加上每天挣得钱
//            day +=1;//天数+1
//            if(sum >=108){
//                break;
//            }
//            i += 2;//后一天比前一天多挣2元
//        }
//        System.out.println(day);
//        法二
        int sum = 1;
        int target = 108;
        int day = 1;
        int todayMoney = 1;
        while (sum < target) {
            day++;
            todayMoney = todayMoney + 2;
            sum = sum + todayMoney;
            System.out.println("day=" + day);
            System.out.println("todayMoney=" + todayMoney);
            System.out.println("sum=" + sum);
        }
        System.out.println(day);


    }

    public static void java18_c_2() {
        /**
         * 5只猴子是好朋友，在海边的椰子树上睡着了。这期间，有商船把一大堆香蕉忘记在沙滩上离去。
         * 第1只猴子醒来，把香蕉均分成5堆，还剩下1个，就吃掉并把自己的一份藏起来继续睡觉。
         * 第2只猴子醒来，把香蕉均分成5堆，还剩下2个，就吃掉并把自己的一份藏起来继续睡觉。
         * 第3只猴子醒来，把香蕉均分成5堆，还剩下3个，就吃掉并把自己的一份藏起来继续睡觉。
         * 第4只猴子醒来，把香蕉均分成5堆，还剩下4，就吃掉并把自己的一份藏起来继续睡觉。
         * 第5猴子醒来，重新把香蕉均分成5堆，哈哈，正好不剩！
         * 请计算一开始最少有多少个香蕉。
         * 分析：不知道香蕉得数量，设为n个。用while循环。满足下面得条件结束：
         * */
        int banana = 1;
        while (true) {
            // 判断香蕉数量是否满足第一个猴子的条件
            if (banana % 5 == 1) {
                // 计算每个猴子吃掉自己那份后剩下的香蕉，比如51个香蕉，分成五份，每份10个，剩余一个，第一个猴子吃完后，藏完后，剩余40个，
                int monkey1 = (banana - 1) / 5 * 4;
                if (monkey1 % 5 == 2) {
                    int monkey2 = (monkey1 - 2) / 5 * 4;
                    if (monkey2 % 5 == 3) {
                        int monkey3 = (monkey2 - 3) / 5 * 4;
                        if (monkey3 % 5 == 4) { // 这一步必须加monkey4>0 ，不然monkey3=4时，最后一个猴子没得分了也会满足条件
                            int monkey4 = (monkey3 - 4) / 5 * 4;
                            if (monkey4 % 5 == 0 && monkey4 > 0) {
                                break;
                            }
                        }
                    }
                }
            }
//            香蕉累加到满足所有猴子条件为止
            banana++;
        }
        System.out.println("banana=" + banana);


//        法二:
//        int banana = 1; // 开始尝试的香蕉数目
//        while (true) {
//            int tempBanana = banana;
//            boolean flag = true;
//            for (int i = 0; i < 5; i++) { // 对每只猴子进行检查
//                if ((tempBanana - (i + 1)) % 5 == 0) { // 检查当前猴子的操作是否符合条件
//                    tempBanana = (tempBanana - (i + 1)) * 4 / 5; // 更新剩余香蕉数
//                } else {
//                    flag = false;
//                    break;
//                }
//            }
//            if (flag && tempBanana > 0) { // 如果所有的猴子都满足条件且剩余香蕉数大于0
//                System.out.println("最初最少有 " + banana + " 个香蕉。");
//                break;
//            }
//            banana++;
//        }


    }
}
